package note;
//Description:类和对象  类就是对某一个类型的抽象  对象就是类真正来产生的一个实体
public class Note8 {
    public static void main(String[] args) {//main还是需要static的 jvm里面设计的就是这样
        //静态方法里面只能引用静态变量方法其余需使用对象来使用
        Person person1 = null;//通过类实例化对象  这个引用不指向任何对象
        Person person2 = person1;//这个引用指向person1指向的对象
        Person person = new Person();//person是一个变量不是地址里面存储的是地址也被叫做引用
        //如果没有自定义的构造方法  系统默认生成的构造方法
        person.setName("yxd");//修改封装的变量
        System.out.println(person.getName());
        /**
         *一个引用不可以同时指向多个对象  引用不一定在栈上 在main外定义的就属于类的成员变量了
         */
        person.sex = "man";
        System.out.println(person.sex);//普通成员变量通过对象的引用来访问
        System.out.println(person.sex);//默认初始值为null
        Person.func();//静态方法
        System.out.println(person);//最后调用toString来返回使用快捷键自己生成鼠标右键Gen...
        //展示所有属性
        new Person();//匿名对象只是用一次
    }
}
class Person{//class 类名
    //字段-》属性-》成员变量
    private String name;
    //封装 使更加安全 只能使用get和set对这个进行修改
    static int age1 = 18;
    /**静态成员变量 存在于方法区(里面有字节码文件.class  （代码片段）) 属于类变量 不需要对象
    *静态的直接使用类.变量或方法      静态成员变量是不可以在方法中定义的（是属于类的 需要使用类来引用）
    *普通方法可以可以调用静态方法  静态方法内不能调用普通方法 如果不加static在main内不可随意调用需要对象
    */
    private int age;
    public String sex;//公共的可以随时改变
    public final int size = 10;//放在对象中 是常量  但和final修饰没关系
    public static final int count =99;//放在方法区内
    public static  int count1 =99;//如果都是静态的按顺序赋值 如果没有初始化会使用代码块里面的
    {
        this.age = 22;//初始化
        System.out.println("实例化代码块");//可以实例化数据成员
    }
    //代码块 类调用的时候就会调用
    static{
        count1 = 55;//初始化
        System.out.println("静态代码块");//只执行一次  静态的变量赋初值有顺序 先打印静态代码块
    }//静态代码块不用实例化都可以被执行
    //构造方法如果没有自定义的构造方法  系统默认会有一个无参数的构造方法
     Person(){
        this("yxd");//调用带有一个参数的构造方法 也可以调用其它构造方法 但只能放在第一行  且只能存放在构造函数内
        System.out.println("这是一个无参数的构造方法");//构造方法私有化后只能在类中使用
    }
    Person(String name){
        this.name = name;//this代表当前对象是错误的 也可代表当前对象的引用
        System.out.println("Person(String name)：这是一个带String参数的构造方法");
    }

    //....可以有很多构造方法  构造方法 之间  构成重载 构造方法内可以传参 给属性赋值
    //方法-》行为
    public void eat(){
        System.out.println(name + "正在吃饭");
    }
    public void sleep(){
        System.out.println(name + " ");
    }

    public void setAge(int age) {
        this.age = age;//this指代当前对象的引用
    }
    public int getAge() {
        return age;
    }
    public void setName(String name) {//公共的修改方法(给name赋值的)
        this.name = name;
        /*习惯使用this比较好
        this和super
        this.data调用当前对象的属性
        this.func()调用当前对象的方法
        this() 调用当前对象的其他构造方法
         */
    }

    public String getName() {//得到方法
        return name;
    }
    @Override
    public String toString() {//toString
        return "Person1{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    //private 方法被这个修饰就封装起来了  只能通过类里面的公共接口来改变  更安全了
    public void print(){
        System.out.println("性别"+sex);
    }
    public static void func(){
        //print();error 普通方法需要对象来调用 静态方法内可以访问静态变量 但不能定义
        //this.sex = "男";error
        System.out.println("这是个类方法");
    }
}